Deskriptive Statistik

Maße der zentralen Tendenz und Streuung

Daniela Palleschi

Humboldt-Universität zu Berlin

2023-06-13

Wiederholung

Letzte Woche haben wir…

  • etwas über breite und lange Daten gelernt ✅
  • breite Daten länger gemacht ✅
  • lange Daten breiter gemacht ✅

Überprüfung

pacman::p_load(tidyverse,
               here)
df_biondo <- read_csv(here("daten", "biondo_etal_2021_tidy.csv"))
df_billboard <- read_csv(here("daten", "billboard.csv"))
1df_biondo %>%
2  head(n = 5) %>%
3  knitr::kable() %>%
4  kableExtra::kable_styling(font_size = 20)
1
Nehmen Sie den Datenrahmen df_biondo, und dann
2
nimm nur die ersten 5 Zeilen, und dann
3
erstelle eine hübsche knitr-Tabelle, und dann
4
mache die Tabelle noch schöner mit kableExtra, mit Schriftgröße 20
subj item tense verb gramm acc rt tt
1 1 future representarán 1 1 840.1917 1596
1 2 future alzarán 1 1 1310.1809 648
1 3 future centrarán 1 1 700.2674 841
1 4 future coleccionarán 1 1 650.1856 1337
1 5 future complementarán 1 1 580.2159 1400
  • wir wollen normalerweise die Ausgabe von head(), knitr::kable() und kableExtra::kable_styling() nicht als Objekt speichern
    • und schon gar nicht als ein Objekt, das mit df_ beginnt, was für dataframe steht

Zwei Beispiele für dasselbe Problem

df_biondo_long <- df_biondo %>% 
  pivot_longer(
    cols = ("rt" | "tt"),
    names_to = "maß",
    values_to = "ms") %>% 
  head(n = 10) %>% 
  knitr::kable() %>% 
  kableExtra::kable_styling()
df_biondo_long <- df_biondo %>%
  pivot_longer(
    cols = c(contains("rt"), contains("tt"))
  ) %>%
  knitr::kable() %>%
  kableExtra::kable_styling(font_size = 20)

Speichern Sie keine knitr-Tabelle, wenn Sie wirklich einen Datenrahmen (d.h., df_…) speichern wollen. Speichern Sie stattdessen zuerst die df, und geben Sie die df in einem anderen Codeabschnitt als formatierte Tabelle aus.

# save longer dataframe
df_biondo_long <- df_biondo %>% 
  pivot_longer(
    cols = ("rt" | "tt"),
    names_to = "maß",
    values_to = "ms")
# print table of longer df
df_biondo_long %>% 
  head(n = 10) %>% 
  knitr::kable() %>% 
  kableExtra::kable_styling(font_size = 20)
subj item tense verb gramm acc maß ms
1 1 future representarán 1 1 rt 840.1917
1 1 future representarán 1 1 tt 1596.0000
1 2 future alzarán 1 1 rt 1310.1809
1 2 future alzarán 1 1 tt 648.0000
1 3 future centrarán 1 1 rt 700.2674
1 3 future centrarán 1 1 tt 841.0000
1 4 future coleccionarán 1 1 rt 650.1856
1 4 future coleccionarán 1 1 tt 1337.0000
1 5 future complementarán 1 1 rt 580.2159
1 5 future complementarán 1 1 tt 1400.0000

Obwohl pivot_longer() funktionierte, waren die Argumente für cols = nicht ganz richtig. Wir wollen hier c() verwenden, um die relevanten Spalten aufzulisten (und nicht eine Bedingung verwenden). Außerdem müssen die Spaltennamen nicht in Anführungszeichen gesetzt werden, da sie bereits bekannte Entitäten sind.

# save longer dataframe
df_biondo_long <- df_biondo %>% 
  pivot_longer(
    cols = c(rt,tt),
    names_to = "maß",
    values_to = "ms")

Einrichtung:

df_billboard_tidy <- df_billboard %>% 
  pivot_longer(
    cols = starts_with("wk"), 
    names_to = "week", 
    values_to = "rank",
    values_drop_na = TRUE
  ) %>% 
  mutate(week = parse_number(week))

Warum wird mein Titel (Last Resort von Papa Roach) nicht gefunden?

df_billboard_tidy %>%
  select(contains("Resort"))
ggplot(data = df_billboard_tidy,
  aes(x = week, y = rank)) +
  labs(title = "'Last Resort' by Papa Roach",
       x = "Number of weeks", y = "Rank") +
  geom_density()

Wir wollen Zeilen filtern(), nicht Spalten auswählen (i.e., select()).

df_billboard_tidy %>%
  filter(track == "Last Resort") %>% 
  head()
# A tibble: 6 × 5
  artist     track       date_entered  week  rank
  <chr>      <chr>       <date>       <dbl> <dbl>
1 Papa Roach Last Resort 2000-07-29       1    75
2 Papa Roach Last Resort 2000-07-29       2    71
3 Papa Roach Last Resort 2000-07-29       3    69
4 Papa Roach Last Resort 2000-07-29       4    69
5 Papa Roach Last Resort 2000-07-29       5    66
6 Papa Roach Last Resort 2000-07-29       6    64

Die Funktion geom_density() erfordert, dass es kein ästhetisches y gibt (weil dies immer die Dichte ist). Wir wollen geom_line().

df_billboard_tidy %>%
  filter(track == "Last Resort") %>% 
ggplot(
  aes(x = week, y = rank)) +
  labs(title = "'Last Resort' by Papa Roach",
       x = "Number of weeks", y = "Rank") +
  geom_line()

Heutige Ziele

Heute werden wir…

  • die Maße der zentralen Tendenz (wieder) kennenlernen
  • Streuungsmaße (neu) kennenlernen
  • lernen, wie man die Funktion summarise() von dplyr benutzt
  • lernen, wie man Zusammenfassungen .by Gruppe erstellt

Lust auf mehr?

Ch.4, Section 4.5 Groups in Wickham et al. (o. J.)

Einrichtung

Session > Restart R um mit einer neuen Umgebung zu beginnen.

pacman::p_load(tidyverse,
               here)
df_flights <- read_csv(here("daten", "flights.csv"))

Deskriptive Statistik

  • Die deskriptive Statistik beschreibt die zentrale Tendenz, die Variabilität und die Verteilung der Daten.

  • manchmal auch “zusammenfassende” Statistik genannt, weil sie die beobachteten Daten zusammenfasst.

Anzahl der Werte (\(n\))

  • wichtige Informationen bei der Zusammenfassung von Daten
    • Wenn wir mehr Daten haben (höher \(n\)), haben wir mehr Vertrauen in die Schlussfolgerungen, die wir aus unseren Daten ziehen, weil wir mehr Beweise haben.
    • wird auch zur Berechnung einiger deskriptiver Statistiken verwendet
values <- c(3,1,2)
length(values)
[1] 3

length() versus nrow() and n()

  • die Funktion “Länge()” gibt an, wie viele (horizontale) Werte ein Objekt enthält
    • Wenn das Objekt ein Datenrahmen ist (statt eines Vektors wie “Werte”), sagt sie uns, wie viele Spalten wir haben.
length(df_flights)
[1] 19
  • Um die Anzahl der Werte (d.h. Beobachtungen/Zeilen) in einem Datenrahmen zu zählen, können wir verwenden
    • nrow() (Basis-R-Syntax), oder
    • n() (dplyr-Syntax), das werden wir später noch sehen
nrow(df_flights)
[1] 336776

Maße der zentralen Tendenz

  • ziemlich genau das, was wir für numerische Variablen mit der Funktion summary() erhalten
df_flights %>% 
  select(air_time, distance) %>% 
  summary() %>% 
  knitr::kable() %>% 
  kableExtra::kable_styling(font_size = 30)
air_time distance
Min. : 20.0 Min. : 17
1st Qu.: 82.0 1st Qu.: 502
Median :129.0 Median : 872
Mean :150.7 Mean :1040
3rd Qu.:192.0 3rd Qu.:1389
Max. :695.0 Max. :4983
NA's :9430 NA

Durchschnitt (\(\mu\))

  • mean = Mittelwert, Durchschnitt
  • die Summe aller Werte geteilt durch die Anzahl der Werte

\[ \mu = \frac{Summe\;der\;Werte} {n} \]

  • Wir können den Mittelwert leicht von Hand berechnen, wenn wir nur wenige Werte haben
(3+1+2)/3
[1] 2
  • wir können die Werte auch als Vektor (eine Liste von Werten derselben Klasse) speichern
  • und dann die Funktion mean() verwenden, um ihren Mittelwert zu berechnen
values <- c(3,1,2)
mean(values)
[1] 2
  • oder wir können die Funktion mean() auf eine Variable in einem Datenrahmen anwenden
    • Verwendung des Zeichens $, um anzugeben, dass eine Spalte aus einem Datenrahmen ausgewählt werden soll
mean(df_flights$distance)
[1] 1039.913
  • df_flights$distance ist vergleichbar mit df_flights %>% select(distance)

Median

  • median = Median, mediane Wert; der Wert in der Mitte des Datensatzes
  • Wenn Sie alle Ihre Werte in aufsteigender (oder absteigender) Reihenfolge aneinanderreihen, ist der mittlere Wert der Median
    • Wenn Sie z. B. 5 Werte haben, ist der 3. Wert der Median
    • bei 6 Werten ist der Mittelwert aus dem 3. und 4. Wert der Median
  • 50% der Daten liegen unter diesem Wert, 50% darüber
median(df_flights$distance)
[1] 872

Modalwert

  • mode = Modalwert; der Wert, der am häufigsten in einem Datensatz vorkommt
  • Es gibt keine R-Funktion zur Bestimmung des “Modus”, aber wir können ihn mit einem Histogramm visualisieren
df_flights %>% 
  ggplot(aes(x = distance)) +
  geom_histogram() +
  theme_minimal() 

Maße der Streuung

  • Maße der zentralen Tendenz beschreiben die Mitte der Daten (normalerweise)
  • Streuungsmaße beschreiben die Verteilung der Datenpunkte

Wertebereich

  • range = Wertebereich
    • kann sich auf den höchsten und den niedrigsten Wert beziehen, oder
    • die Differenz zwischen höchstem und niedrigstem Wert
  • max() und min() den höchsten und den niedrigsten Wert ausdrucken
max(values)
[1] 3
min(values)
[1] 1
  • range() druckt den niedrigsten und den höchsten Wert
range(values)
[1] 1 3
  • können wir die Differenz zwischen diesen Werten berechnen:
max(values) - min(values)
[1] 2

Standardabweichung (sd or \(\sigma\))

  • ein Maß dafür, wie gestreut die Daten im Verhältnis zum Mittelwert sind

    • eine niedrige Standardabweichung bedeutet, dass die Daten um den Mittelwert herum gruppiert sind (d. h. es gibt eine geringere Streuung)
    • eine hohe Standardabweichung bedeutet, dass die Daten stärker gestreut sind
  • Die Standardabweichung wird sehr oft angegeben, wenn der Mittelwert angegeben wird.

  • um sd zu berechnen

    • die Quadratwurzel (\(\sqrt{}\)) der Summe der quadrierten Wertabweichungen vom Mittelwert (\((x - \mu)^2\)) geteilt durch die Anzahl der Beobachtungen minus 1 (\(n-1\))
sd(values)
[1] 1
  • unsere Werte (\(x\)) sind:
values
[1] 3 1 2
  • der Mittelwert (\(\mu\)) ist:
mean(values)
[1] 2
  • die Anzahl der Werte (\(n\)) ist:
length(values)
[1] 3
  • die Standardabweichung (\(\sigma\)) ist:
sd(values)
[1] 1

\[\begin{align} \sigma & = \sqrt{\frac{(x_1-\mu)^2 + (x_2-\mu)^2 + (x_3-\mu)^2}{N-1}} \\ & = \sqrt{\frac{(3-\mu)^2 + (1-\mu)^2 + (2-\mu)^2}{N-1}} \\ & = \sqrt{\frac{(3-2)^2 + (1-2)^2 + (2-2)^2}{3-1}} \\ & = \sqrt{\frac{(1)^2 + (-1)^2 + (0)^2}{2}} \\ & = \sqrt{\frac{1 + 1 + 0}{2}} \\ & = \sqrt{\frac{2}{2}} = \sqrt{1} = 1 \end{align}\]

  • Inwiefern ist die Standardabweichung hilfreich?
    • Sie gibt uns ein Maß dafür, wie “eng” die beobachteten Werte am Mittelwert liegen.
  • Verschiedene Datensätze können zum Beispiel denselben Mittelwert haben:
values2 <- c(55,55,55,55,55,57,57,57,57,57)
values3 <- c(1,1,1,1,100,100,100,100,100)
mean(values2)
[1] 56
mean(values3)
[1] 56
  • values2 und values3 haben den gleichen Mittelwert
    • Wenn wir nur den Mittelwert berechnen würden, könnten wir zu dem Schluss kommen, dass die Daten ähnlich sind.
  • aber ihre Standardabweichungen werden sich unterscheiden, weil die beobachteten Werte alle unterschiedlich weit vom Mittelwert abweichen
  • Welcher Vektor wird Ihrer Meinung nach die geringste Standardabweichung haben? Und warum?
sd(values2)
[1] 1.054093
sd(values3)
[1] 52.17758

CBerechnung der Standardabweichung

  • Berechnen Sie zunächst die Abweichung jedes Wertes vom Mittelwert
    • und quadriere diesen Wert
  • addiere alle diese quadrierten Abweichungswerte
    • dividiere durch die Anzahl der Beobachtungen bis auf eine (\(n-1\))
  • dies ist nun die Varianz, um die Standardabweichung der Population zu erhalten, berechnet man die Quadratwurzel dieses Wertes

\[\begin{align} \sigma & = \sqrt\frac{(56-1)^2 + (56-1)^2 + (56-1)^2 + (56-1)^2 + (56-100)^2 + (56-100)^2 + (56-100)^2 + (56-100)^2 + (56-100)^2 + (56-100)^2}{n-1} \\ & = \sqrt{\frac{3025 + 3025 + 3025 + 3025 + 1936 + 1936 + 1936 + 1936 + 1936}{9-1}} \\ & = \sqrt{\frac{21780}{8}} \\ & = \sqrt{2722.5} \\ & = 52.17758 \end{align}\]

  • Da wir durch die Anzahl der Beobachtungen (minus 1) dividieren, wird die Standardabweichung kleiner sein, wenn wir mehr Beobachtungen haben (und daher durch eine größere Zahl dividieren) (denn wenn wir durch eine große Zahl dividieren, ist das Produkt viel kleiner)

  • Beispiel: Wenn wir 100 durch die Zahl 2 teilen, ist das Ergebnis 50. Wenn wir 100 durch eine größere Zahl, wie 50, teilen, ist das Ergebnis (2) kleiner.

dplyr::summarise()

  • berechnet Zusammenfassungen von Daten
    • aber wir müssen ihm sagen, was es berechnen soll und für welche Variable(n)
df_flights %>% 
  summarise(N = n())
# A tibble: 1 × 1
       N
   <int>
1 336776
  • wir können auch mehrere Berechnungen auf einmal durchführen
df_flights %>% 
  summarise(mean_distance = mean(distance, na.rm=T),
            sd_distance = sd(distance, na.rm = T),
            N = n()) %>% 
  knitr::kable() %>% 
  kableExtra::kable_styling()
mean_distance sd_distance N
1039.913 733.233 336776
  • und wir können Berechnungen angeben
df_flights %>% 
  summarise(range_distance = max(distance) - min(distance))
# A tibble: 1 × 1
  range_distance
           <dbl>
1           4966

Fehlende Werte

  • einige Berechnungen sind bei fehlenden Werten nicht möglich
    • die Variable “air_time” hat einige fehlende Werte
df_flights %>% 
  select(air_time, distance) %>% 
  summary()
    air_time        distance   
 Min.   : 20.0   Min.   :  17  
 1st Qu.: 82.0   1st Qu.: 502  
 Median :129.0   Median : 872  
 Mean   :150.7   Mean   :1040  
 3rd Qu.:192.0   3rd Qu.:1389  
 Max.   :695.0   Max.   :4983  
 NA's   :9430                  
df_flights %>% 
  summarise(mean_air_time = mean(air_time))
# A tibble: 1 × 1
  mean_air_time
          <dbl>
1            NA
  • Bei der Arbeit mit realen Daten ist es nicht trivial, wie man mit fehlenden Werten umgeht.
    • z.B. könnten wir alle “N”-Werte in “0” umwandeln, wenn wir wollen, dass sie zur Berechnung des “Mittelwerts” beitragen
    • aber in den meisten Fällen wollen wir sie einfach entfernen (wie wir es schon oft getan haben)
  • Wir können dies leicht mit dem dplyr-Verb drop_na() tun
df_flights %>% 
  drop_na() %>% 
  summarise(mean = mean(air_time))
# A tibble: 1 × 1
   mean
  <dbl>
1  151.

Gruppierung von Variablen

  • Wir wollen nicht immer nur die zusammenfassenden Statistiken für einen gesamten Datensatz kennen, aber
    • Wir wollen in der Regel bestimmte Gruppen vergleichen (z. B. den Vergleich von “Flugzeit” zwischen Fluggesellschaften).

.by =

  • das brandneue Argument .by = in summarise() berechnet unsere Berechnungen auf gruppierten Teilmengen der Daten (erst ein paar Monate alt!)
    • Es nimmt eine “Variable” (d.h. einen Spaltennamen) und gruppiert nach den Ebenen dieser Variable
df_flights %>% 
  drop_na() %>% 
  summarise(mean_air_time = mean(air_time),
            mean_distance = mean(distance),
            N = n(),
            .by = month) %>% 
  arrange(mean_air_time)
# A tibble: 12 × 4
   month mean_air_time mean_distance     N
   <dbl>         <dbl>         <dbl> <int>
 1     9          143.         1049. 27010
 2     5          146.         1049. 28128
 3     7          147.         1070. 28293
 4     8          148.         1069. 28756
 5    10          149.         1042. 28618
 6     3          149.         1023. 27902
 7     6          150.         1074. 27075
 8     2          151.         1008. 23611
 9     4          153.         1048. 27564
10     1          154.         1014. 26398
11    11          155.         1052. 26971
12    12          163.         1076. 27020

Gruppieren nach mehreren Variablen

  • Wir können auch nach mehreren Variablen gruppieren
    • Dazu benötigen wir concatenate (c())
  • wir filtern, um nur ein paar Träger zu haben, damit unsere Ausgabe nicht zu lang wird
df_flights %>% 
  drop_na() %>%
  filter(carrier %in% c("UA", "AA")) %>% 
  summarise(mean_air_time = mean(air_time),
            mean_distance = mean(distance),
            N = n(),
            .by = c(month, carrier)) %>% 
  arrange(month, carrier) %>% 
  knitr::kable() %>% 
  kableExtra::kable_styling(font_size = 20)
month carrier mean_air_time mean_distance N
1 AA 199.5433 1353.099 2724
1 UA 213.7022 1463.894 4590
2 AA 197.9195 1352.686 2399
2 UA 207.4393 1437.190 4157
3 AA 192.3532 1349.525 2741
3 UA 204.7959 1454.933 4909
4 AA 192.9615 1343.950 2649
4 UA 212.0633 1504.828 4978
5 AA 183.4554 1341.822 2749
5 UA 209.1620 1559.828 4890
6 AA 183.4868 1338.606 2683
6 UA 213.0440 1580.517 4885
7 AA 178.3669 1328.671 2769
7 UA 207.8638 1581.408 4971
8 AA 179.4030 1326.186 2819
8 UA 212.0912 1593.323 5085
9 AA 179.3695 1344.793 2568
9 UA 208.0990 1571.911 4636
10 AA 186.8477 1337.230 2699
10 UA 210.3654 1528.576 5035
11 AA 193.3208 1344.323 2550
11 UA 218.2343 1534.453 4827
12 AA 200.7724 1361.288 2597
12 UA 224.2924 1546.725 4819

group_by()

  • vor .by() haben wir das dplyr-Verb group_by() und ungroup() verwendet
    • Ich bevorzuge das neue .by, weil es die Gruppierung lokal hält (keine Notwendigkeit für ungroup())
    • Behalten Sie dies im Hinterkopf, Sie könnten group_by() in freier Wildbahn sehen
df_flights %>% 
  drop_na() %>%
  filter(carrier %in% c("UA", "AA")) %>% 
  group_by(month, carrier) %>% 
  summarise(mean_air_time = mean(air_time),
            mean_distance = mean(distance),
            N = n()) %>% 
  ungroup() %>% 
  arrange(month, carrier) %>% 
  head(n = 10) %>% 
  knitr::kable() %>% 
  kableExtra::kable_styling(font_size = 20) 
month carrier mean_air_time mean_distance N
1 AA 199.5433 1353.099 2724
1 UA 213.7022 1463.894 4590
2 AA 197.9195 1352.686 2399
2 UA 207.4393 1437.190 4157
3 AA 192.3532 1349.525 2741
3 UA 204.7959 1454.933 4909
4 AA 192.9615 1343.950 2649
4 UA 212.0633 1504.828 4978
5 AA 183.4554 1341.822 2749
5 UA 209.1620 1559.828 4890

Anscombe’s Quartet

  • Francis Anscombe erstellte 1973 4 Datensätze, um zu zeigen, wie wichtig es ist, Daten zu visualisieren, bevor man sie analysiert und ein Modell erstellt
    • Diese vier Diagramme stellen 4 Datensätze dar, die alle einen nahezu identischen Mittelwert und eine Standardabweichung, aber sehr unterschiedliche Verteilungen aufweisen
Tabelle 1: Summary stats of Anscombe’s quratet datasets
grp mean_x mean_y min_x min_y max_x max_y crrltn
Group 1 9 7.500909 4 4.26 14 10.84 0.8164205
Group 2 9 7.500909 4 3.10 14 9.26 0.8162365
Group 3 9 7.500000 4 5.39 14 12.74 0.8162867
Group 4 9 7.500909 8 5.25 19 12.50 0.8165214

Abbildung 1: Plots of Anscombe’s quratet distributions

DatasaurRus

  • das Paket datasaurRus enthält einige weitere Datensätze, die ähnliche Mittelwerte und SD, aber unterschiedliche Verteilungen aufweisen
pacman::p_load("datasauRus")
datasaurus_dozen %>% 
    group_by(dataset) %>% 
    summarize(
      mean_x    = mean(x),
      mean_y    = mean(y),
      std_dev_x = sd(x),
      std_dev_y = sd(y),
      corr_x_y  = cor(x, y)
    ) %>% 
  knitr::kable() %>% 
  kableExtra::kable_styling(font_size = 20)
Tabelle 2: Summary stats of datasauRus datasets
dataset mean_x mean_y std_dev_x std_dev_y corr_x_y
away 54.26610 47.83472 16.76983 26.93974 -0.0641284
bullseye 54.26873 47.83082 16.76924 26.93573 -0.0685864
circle 54.26732 47.83772 16.76001 26.93004 -0.0683434
dino 54.26327 47.83225 16.76514 26.93540 -0.0644719
dots 54.26030 47.83983 16.76774 26.93019 -0.0603414
h_lines 54.26144 47.83025 16.76590 26.93988 -0.0617148
high_lines 54.26881 47.83545 16.76670 26.94000 -0.0685042
slant_down 54.26785 47.83590 16.76676 26.93610 -0.0689797
slant_up 54.26588 47.83150 16.76885 26.93861 -0.0686092
star 54.26734 47.83955 16.76896 26.93027 -0.0629611
v_lines 54.26993 47.83699 16.76996 26.93768 -0.0694456
wide_lines 54.26692 47.83160 16.77000 26.93790 -0.0665752
x_shape 54.26015 47.83972 16.76996 26.93000 -0.0655833
  • Wenn wir die Datensätze grafisch darstellen, sehen sie alle sehr unterschiedlich aus!

Abbildung 2: Plots of datasauRus dataset distributions

Stellen Sie Ihre Daten also immer grafisch dar und betrachten Sie nicht nur die beschreibenden Statistiken!!! Beides ist sehr wichtig für das Verständnis Ihrer Daten.

Aufgaben

  1. Berechnen Sie die Standardabweichung der Werte 152, 19, 1398, 67, 2111, ohne die Funktion sd() zu benutzen.
    • zeige deine Arbeit. Die folgende R-Syntax könnte nützlich sein (je nachdem, wie Sie es machen wollen):
      • c()
      • Mittelwert()
      • x^2 berechnet das Quadrat eines Wertes (hier, x)
      • sqrt() berechnet die Quadratwurzel
      • Länge()
  1. Benutze die Funktion sd(), um die Standardabweichung der obigen Werte zu drucken. Haben Sie es richtig gemacht?
  2. Benutze summarise, um den Mittelwert, die Standardabweichung und die Anzahl der Beobachtungen für dep_delay zu drucken.
    • Hinweis: Müssen Sie fehlende Werte (NA) entfernen?
  3. Machen Sie dasselbe, aber fügen Sie das Argument .by() hinzu, um die Abfahrtsverzögerung (dep_delay) pro Monat zu finden
    • Ordnen Sie die Ausgabe nach der mittleren Abflugverspätung an.
  4. Drucke die Ausgabe mit einer schön formatierten Tabelle unter Verwendung von knitr::kable() und kableExtra::kable_styling())
    • eine Tabellenbeschriftung (#| label: tbl-...) und eine Tabellenüberschrift (#| tbl-cap:) einfügen
    • eine Beschreibung der Tabellenergebnisse, einschließlich eines Querverweises auf die Tabelle (@tbl-...)

Heutige Ziele 🏁

Heute haben wir…

  • Maße der zentralen Tendenz (neu) kennengelernt ✅
  • (Wieder-)Erlernen von Streuungsmaßen ✅
  • gelernt, wie man die Funktion summarise() von dplyr benutzt ✅
  • gelernt, wie man Zusammenfassungen “nach” Gruppen erstellt ✅

Session Info

Hergestellt mit R version 4.3.0 (2023-04-21) (Already Tomorrow) und RStudioversion 2023.3.0.386 (Cherry Blossom).

sessionInfo()
R version 4.3.0 (2023-04-21)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.2.1

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Europe/Berlin
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] datasauRus_0.1.6 here_1.0.1       lubridate_1.9.2  forcats_1.0.0   
 [5] stringr_1.5.0    dplyr_1.1.2      purrr_1.0.1      readr_2.1.4     
 [9] tidyr_1.3.0      tibble_3.2.1     ggplot2_3.4.2    tidyverse_2.0.0 

loaded via a namespace (and not attached):
 [1] utf8_1.2.3            generics_0.1.3        xml2_1.3.4           
 [4] lattice_0.21-8        stringi_1.7.12        hms_1.1.3            
 [7] digest_0.6.31         magrittr_2.0.3        evaluate_0.21        
[10] grid_4.3.0            timechange_0.2.0      fastmap_1.1.1        
[13] Matrix_1.5-4          rprojroot_2.0.3       jsonlite_1.8.5       
[16] mgcv_1.8-42           httr_1.4.6            rvest_1.0.3          
[19] fansi_1.0.4           viridisLite_0.4.2     scales_1.2.1         
[22] cli_3.6.1             rlang_1.1.1           crayon_1.5.2         
[25] splines_4.3.0         bit64_4.0.5           munsell_0.5.0        
[28] withr_2.5.0           yaml_2.3.7            tools_4.3.0          
[31] parallel_4.3.0        tzdb_0.4.0            colorspace_2.1-0     
[34] webshot_0.5.4         pacman_0.5.1          kableExtra_1.3.4.9000
[37] vctrs_0.6.2           R6_2.5.1              lifecycle_1.0.3      
[40] bit_4.0.5             vroom_1.6.3           pkgconfig_2.0.3      
[43] pillar_1.9.0          gtable_0.3.3          glue_1.6.2           
[46] systemfonts_1.0.4     highr_0.10            xfun_0.39            
[49] tidyselect_1.2.0      rstudioapi_0.14       knitr_1.43           
[52] farver_2.1.1          nlme_3.1-162          htmltools_0.5.5      
[55] labeling_0.4.2        svglite_2.1.1         rmarkdown_2.22       
[58] compiler_4.3.0       

Literaturverzeichnis

Wickham, H., Çetinkaya-Rundel, M., & Grolemund, G. (o. J.). R for Data Science (2. Aufl.). https://r4ds.hadley.nz/